package cn.tedu.tickets;
/**需求:设计多线程编程模型，4个窗口共计售票100张
 * 本方案使用多线程编程实现方式2:implements Runnable来完成*/
public class TestRunnable {
    public static void main(String[] args) {
        //5.创建自定义类对象,作为唯一的业务对象
        TicketRunnable target = new TicketRunnable();
        //6.创建多个Thread类的对象,作为多线程对象,并将唯一的业务对象传入
        Thread t1 = new Thread(target);
        Thread t2 = new Thread(target);
        Thread t3 = new Thread(target);
        Thread t4 = new Thread(target);
        //7.以多线程的方式启动多个线程对象
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }

}
//1.自定义多线程类实现Runnable接口
class TicketRunnable implements Runnable{
    //3.定义变量用来保存票数
    int tickets = 100;
    //2.添加接口中未实现的方法,里面是我们的业务
    @Override
    public void run() {
        //4.1循环卖票
        while(true){
            synchronized (TicketRunnable.class){
                if(tickets>0){
                    try {
                        /*让每个进来循环的线程对象,都经历休眠10ms,增加错误出现的概率
                         * 问题1: 产生了重卖的现象:同一张票卖给了多个人
                         * 问题2:产生了超卖的现象:超出了规定的票数100,出现了0 -1 -2这样的票*/
                        Thread.sleep(10);//让线程休眠10ms
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //4.2打印当前正在售票的线程名称并且票数-1
                    System.out.println(Thread.currentThread().getName()+"="+tickets--);
                }
                //4.3设置死循环的出口,没票了就停止卖票
                if(tickets <= 0) break;
            }
        }
    }
}
